/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cz.muni.fi.diplomka.servicelayer.gamelogic.manager;

import cz.fi.muni.diplomka.common.Coordinates;
import cz.fi.muni.diplomka.common.enumeration.BuildingType;
import cz.muni.fi.diplomka.servicelayer.dto.BuildingInCity;
import cz.muni.fi.diplomka.servicelayer.dto.BuildingInProgress;
import java.util.List;

/**
 * Interface for manipulating with Buildings in Cities
 *
 * @author Jakub Kutil
 */
public interface CityBuildingManager {

    /**
     * Starts building of specified Building in specified City at specified
     * Coordinates
     *
     * @param cityId Id of City to build in
     * @param buildingInCity Building to build
     * @param coordinates Coordinates to build at
     */
    public void buildBuilding(Long cityId, BuildingInCity buildingInCity, Coordinates coordinates);

    /**
     * Starts upgrading Building in specified City at specified Coordinates
     *
     * @param cityId
     * @param coordinates
     */
    public void upgradeBuilding(Long cityId, Coordinates coordinates);

    /**
     * Razes Building in specified City at specified Coordinates
     *
     * @param cityId Id of specified City
     * @param coordinates specified Coordinates
     */
    public void razeBuilding(Long cityId, Coordinates coordinates);

    /**
     * Gets all Buildings In Progress in specified City
     *
     * @param cityId Id of specified City
     * @return list of Buildings In Progress in specified CIty
     */
    public List<BuildingInProgress> getBuildingsInProgress(Long cityId);

    /**
     * Gets all Buildings in specified City
     *
     * @param cityId Id of specified City
     * @return list of Buildings specified CIty
     */
    public List<BuildingInCity> getAllBuildingsInCity(Long cityId);

    /**
     * Get Building in specified City at specified Coordinates
     *
     * @param cityId Id of specified City
     * @param coordinates specified Coordinates
     * @return found Building
     */
    public BuildingInCity getBuildingAt(Long cityId, Coordinates coordinates);

    /**
     * Gets all Buildings of specified Type in specified City
     *
     * @param cityId Id of specified City
     * @param buildingType specified Type
     * @return list of all Buildings of specified Type in specified City
     */
    public List<BuildingInCity> getAllBuildingsInCityOfType(Long cityId, BuildingType buildingType);

    /**
     * Gets Building In Progress in specified City at specified Coordinates
     *
     * @param cityId Id of specified City
     * @param coordinates specified Coordinates
     * @return Building In Progress in specified City at specified Coordinates
     */
    public BuildingInProgress getBuildingInProgressAtPosition(Long cityId, Coordinates coordinates);

    /**
     * Gets all Buildings In Progress
     *
     * @return list of all Buildings In Progress
     */
    public List<BuildingInProgress> getAllBuildingInProgress();

    /**
     * Create starting Buildings in specified City defined by limits
     * @param cityId Id of specified City
     */
    public void createStartingBuildingsForCity(Long cityId);
}
